package main

import "fmt"

type ValNode struct {
	row int
	col int
	val int
}

func main() {
	//创建一个原始的二维数组 11*11
	var chessArr [11][11]int
	chessArr[1][2] = 1
	chessArr[2][3] = 2
	//输出原始的二维数组
	for _, i := range chessArr {
		for _, j := range i {
			fmt.Printf("%d\t", j)
		}
		fmt.Println()
	}
	//将二维数组 转 稀疏数组
	//1. 先遍历二维数组 如果发现有一个元素的值不为0，创建一个node结构体
	//2、将其放入到对应的切片即可
	var sparseArr []ValNode
	// 标准的一个稀疏数组应该还有一个 记录元素的二维数组的规模（行和列，默认值）
	//创建一个valNode 值结点
	valNode := ValNode{
		row: 11,
		col: 11,
		val: 0,
	}
	sparseArr = append(sparseArr, valNode)
	for i, v := range chessArr {
		for j, v1 := range v {
			if v1 != 0 {
				// 创建一个valnode值节点
				valNode := ValNode{
					row: i,
					col: j,
					val: v1,
				}
				sparseArr = append(sparseArr, valNode)
			}
		}
	}

	// 输出稀疏数组
	for i, v := range sparseArr {
		fmt.Printf("%d:%d %d %d\n", i, v.row, v.col, v.val)
	}
	// 将稀疏数组存盘
	// 如何恢复原始的数组
	// 打开文件,恢复原始数组
	// 先创建一个原始数组
	var chessArr1 [11][11]int
	// 遍历 sparseArr1
	for i, vavalNode1 := range sparseArr {
		if i != 0 {
			chessArr1[vavalNode1.row][vavalNode1.col] = vavalNode1.val
		}
	}
	//打印一下
	for _, v := range chessArr1 {
		for _, v1 := range v {
			fmt.Printf("%d\t", v1)
		}
		fmt.Println()
	}
}
